/**
 * @module lib/template
 * @version $Id: template.js
 */
define('lib/template', ['jquery', 'ant', 'moment'], function($, Ant, moment){
    /**
     * 缓存已经加载的模板
     * @return
     */
    var _tplCache = {};
    
    /**
     * 模板引擎
     * @alias module:lib/template
     * @desc Antjs 的再包装，方便扩展及解偶
     * @param {Object} $el - jquery 选择器返回的对象
     * @param {Object} options - Ant 的实例化参数
     * @return {Ant} 实例化后的Ant
     */
    var template = function($el, options){
        options = $.extend({
            filters : template.filters
        }, options || {});

        var ant   = new Ant($el, options);
        
        return ant;
    };

    /**
     * 
     * @description
     *   ### 模板的过滤函数 
     *   #### dateFormat 时间缀格式化 
     *   ```html
     *   <!-- var time = 1318781876406; -->
     *   <div>{{time}} | dateFormat</div> 格式化成 2014-05-01 
     *   <div>{{time}} | dateFormat:'YY-MM-DD'</div>  格式化成 14-05-01 
     *   ```
     *   #### strCut 字符截取
     *
     * @type {Object}
     */
    template.filters = {};


    /**
     * 返回默认模板的根目录 
     *
     * @type {String}
     */
    template.rootPath = '/js/tpl/';

    /**
     * 注册模板过滤函数
     *
     * @param {String} name - 函数名
     * @param {Function} callback - 函数的实现
     * @return {Void}
     */
    template.filter = function(name, callback){
        template.filters[name] = callback;
    };
    
    /**
     * 加载模板
     * @param {String} tplUrl - 模板路径
     * @param {Function} callback - 回调函数
     * @param {Boolen} noCache - 是否不缓存模板内容。默认为: false
     * @return {Void}
     */
    template.load = function(tplUrl, callback, noCache){
        noCache = noCache === true;
        tplUrl  = $.trim(tplUrl);
        
        if(false === noCache && _tplCache[tplUrl]){
            callback(_tplCache[tplUrl]);
            return;
        }
        if(tplUrl.indexOf(template.rootPath) === 0){
            var name = tplUrl.split(template.rootPath).pop();
            var info = name.split('/');
            if(info.length === 2){
                require(['tpl/' + info[0]], function(tpl){
                    var html = tpl[info[1]];
                    //console.log(html);
                    if(tpl){
                        _tplCache[tplUrl] = '<div role="tpl">' + html + '</div>';
                        callback(_tplCache[tplUrl]);
                    }
                    else{
                        callback('');
                    }
                });
            }
        }
        else{
            $.get(tplUrl, function(html){
                _tplCache[tplUrl] = '<div role="tpl">' + html + '</div>';
                callback(_tplCache[tplUrl]);
            });
        }
    };

    /**
     * 过滤函数,将时间缀格式化
     *
     * @return {String}
     */
    template.filter('dateFormat', function(xVal, format){
        format = format || 'YYYY-MM-DD';
        return moment(xVal).format(format);
    });


    /**
     * 字符截取 
     *
     * @return {String}
     */
    template.filter('strCut', function(str, maxLength, tail){
        maxLength = maxLength || 80;
        tail = tail || '...';
        return str.length > maxLength ? (str.slice(0, maxLength - tail.length) + tail) : str;
    });

    /**
     * 高亮关键字 
     *
     * @return {String}
     */
    template.filter('highlight', function(str, keyword, className){
        var keywords  = $.grep(keyword.split(''), function(v){
            return v !== ' ';
        });
        if(keywords.length === 0){
            return str;
        }
        className = className || 'highlight';
        
        var data = [];
        $.each(str.split(''), function(k1, soure){
            $.each(keywords, function(k, v){
                if(soure.toLowerCase() === v.toLowerCase()){
                    soure = '<i class="' + className + '">' + soure + '</i>';
                    return false;
                }
            });
            data.push(soure);
        });
        return data.join('');
    });

    return template;
});
